package com.java.base.exercise;

import org.checkerframework.checker.units.qual.Time;

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.TimeUnit;

/**
 * @Author RenPu
 * @Date 2021/9/27 11:42
 * @Version 1.0
 * @Description: 栅栏
 * 模拟大数据运算拆分成多个步骤的时候，
 * 我们要核算全国各省的业务数据，每个省的的数据库是独立的
 * 统计的数据量比较大，并且计算的时间比较长
 * 为了提高计算能力，我们使用多线程进行并发计算每个省的业务数据
 * 但是每个省下面又开启了，多个线程进行并行计算
 * 最后再汇总计算。
 **/
public class CycleBarrireDemo {
    public static void main(String[] args) {
        CyclicBarrier cyclicBarrier = new CyclicBarrier(3, new ForkTask());

        new BillTask(cyclicBarrier, "111").start();
        new BillTask(cyclicBarrier, "222").start();
        new BillTask(cyclicBarrier, "333").start();

        System.out.println(" Main Thread  end ");

    }


    static class ForkTask extends Thread {
        @Override
        public void run() {
            System.out.println("所有子任务， 都执行完毕， 就开始执行主任务！！！！！");
        }

    }


    static class BillTask extends Thread {

        private CyclicBarrier cyclicBarrier;
        private String tackName;

        public BillTask(CyclicBarrier cyclicBarrier, String tackName) {
            this.cyclicBarrier = cyclicBarrier;
            this.tackName = tackName;
        }


        @Override
        public void run() {


            try {
                System.out.println("市区" + tackName + "开始运行!!!!!!");
                TimeUnit.SECONDS.sleep(3);    //模拟正在进行核算任务执行
                System.out.println("市区" + tackName + "运算完毕， 等待中........");
                cyclicBarrier.await();
                System.out.println("全部结束,  市区" + tackName + "才开始后面的工作@@@%%%%%%%%");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }


        }


    }


}
